Here we look at the “dualism” scale (Weisman; Packet 3) in detail.
Differences across fieldsites
Mean subscale scores by site
First, let’s take the 5 a priori subscales we posited and look at the average scores for participants in each site:

Some surprising things come out of this:
- US participants scored higher in “dualism”, on average, than other participants in nearly every subscale. This is the opposite of what we might predict.
- GH and VT participants - who were the most likely to be devout Christians, given our samples - scored quite low in “dualism” across the board, even in the more spiritual kinds of “dualism” that were captured by the “Life events” and “Minds, selves, & world” subscales.
Let’s look at these differences in more detail using the “raw data” for individual questions, rather than these subscale scores. (After all, these subscales have never been validated! This is one of the very first times we’ve tried this scale.)
Responses by question, by site
There are two ways we might want to look at the “raw data” here: after reverse-coding (which allows us to see how “dualist” vs. “materialist” participants’ responses were in each site) and before reverse-coding (which allows to to see how often people circled “I agree” vs. “I do not agree”). These are 100% redundant, but for some purposes one might be more intuitive than the other.
AFTER reverse-coding
First, let’s look at responses the way they were intended to be looked at - i.e., after reverse-coding items. Here, we focus on the percentage of people who gave the more “dualist” (i.e., less “materialist”) response to each question:
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

BEFORE reverse-coding
Now, let’s look at responses the way the participants saw them - i.e., before reverse-coding items. Here, we focus on the percentage of people who circled “I agree” for each question:
attributes are not identical across measure variables;
they will be droppedJoining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Either way we look at it, a few weird things jump out. Just to highlight a few that John and I noticed:
- Only 75% of GH participants circled “I agree” to the item “I believe in something like a soul or a spirit” (in the “Minds, selves, & world” subscale). This is lower than the US!
- 56% of GH participants circled “I agree” to the item “Even though some people believe in souls or spirits, there is really no such thing” (also in the “Minds, selves, & world” subscale). This seems really off, and it’s very inconsistent with the “I believe in something like a soul or a spirit” item, above.
- 55% of GH participants and 43% of VT participants cirlced “I agree” to the item “There is no such thing as an afterlife” (in the “Live events” subscale). This is lower than I’d predict among devout Christians.
Many of these questions seem to have been particularly problematic in Ghana, though it could be useful to get other perspectives on the responses from each site.
Scale structure
Another kind of question you could ask is how the different questions were correlated with each other, both overall and within each site.
Overall
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

By site
US alone
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Ghana alone
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Thailand alone
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Vanuatu alone
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

LS0tCnRpdGxlOiAnR3JhcHBsaW5nIHdpdGggdGhlICJEdWFsaXNtIiBzY2FsZScKc3VidGl0bGU6ICdMYXN0IHVwZGF0ZWQgMjAxOC0wNC0wNicKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CiMgc2V0IHdvcmtpbmcgZGlyZWN0b3IKIyBzZXR3ZCgiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzLyIpCgojIGxvYWQgcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocm1zKQpsaWJyYXJ5KGdnZGVuZHJvKQpsaWJyYXJ5KHBzeWNoKQoKIyBsb2FkIHF1ZXN0aW9uIGtleSAoaW5jbHVkaW5nIG1hbnVhbCByZXZlcnNlLWNvZGluZykKcXVlc3Rpb25fa2V5IDwtIHJlYWQuY3N2KCIvL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzL3BhY2tldHMxMjNfcXVlc3Rpb25fa2V5X2J5aGFuZC5jc3YiKQoKIyBsb2FkIGRhdGEgKHJldmVyc2UtY29kZWQpCmRfbG9uZyA8LSByZWFkX2NzdigiLy9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvdGVtcGxldG9uX3BhY2tldHMvcGFja2V0czEyMy9wYWNrZXRzMTIzX2RhdGFfYnlxdWVzdGlvbl9sb25nLmNzdiIpICU+JQogIG11dGF0ZShjdHJ5ID0gZmFjdG9yKGN0cnksIAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoYW5hIiwgInRoYWlsYW5kIiwgImNoaW5hIiwgInZhbnVhdHUiKSkpCmRfbG9uZ19zdWJzY2FsZSA8LSByZWFkX2NzdigiLy9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvdGVtcGxldG9uX3BhY2tldHMvcGFja2V0czEyMy9wYWNrZXRzMTIzX2RhdGFfYnlzdWJzY2FsZV9sb25nLmNzdiIpICU+JQogIG11dGF0ZShjdHJ5ID0gZmFjdG9yKGN0cnksIAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoYW5hIiwgInRoYWlsYW5kIiwgImNoaW5hIiwgInZhbnVhdHUiKSkpCgojIGxvYWQgZGF0YSAoYmVmb3JlIHJldmVyc2UtY29kaW5nKQpkX2FsbCA8LSByZWFkLmNzdigiLy9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvdGVtcGxldG9uX3BhY2tldHMvcGFja2V0czEyMy9wYWNrZXRzMTIzX2RhdGEuY3N2IikKCiMgbWFrZSBjdXN0b20gZnVuY3Rpb25zCnJvdW5kMiA8LSBmdW5jdGlvbih4KSB7Zm9ybWF0KHJvdW5kKHgsIDIpLCBkaWdpdHMgPSAyKX0KYGBgCgpIZXJlIHdlIGxvb2sgYXQgdGhlICJkdWFsaXNtIiBzY2FsZSAoV2Vpc21hbjsgUGFja2V0IDMpIGluIGRldGFpbC4KCiMgRGlmZmVyZW5jZXMgYWNyb3NzIGZpZWxkc2l0ZXMKCiMjIE1lYW4gc3Vic2NhbGUgc2NvcmVzIGJ5IHNpdGUKCkZpcnN0LCBsZXQncyB0YWtlIHRoZSA1IGEgcHJpb3JpIHN1YnNjYWxlcyB3ZSBwb3NpdGVkIGFuZCBsb29rIGF0IHRoZSBhdmVyYWdlIHNjb3JlcyBmb3IgcGFydGljaXBhbnRzIGluIGVhY2ggc2l0ZToKCmBgYHtyLCBpbmNsdWRlID0gRn0KZF9sb25nX3N1YnNjYWxlX2Jvb3QgPC0gZF9sb25nX3N1YnNjYWxlICU+JQogIGZpbHRlcighaXMubmEoc3VtX3Njb3JlKSkgJT4lCiAgZ3JvdXBfYnkoY3RyeSwgcGFja2V0LCBzdWJzY2FsZSkgJT4lCiAgZG8oZGF0YS5mcmFtZShyYmluZChzbWVhbi5jbC5ib290KC4kc3VtX3Njb3JlKSkpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKHN1YnNjYWxlICE9ICJhdHRuIikgJT4lCiAgbGVmdF9qb2luKGRfbG9uZ19zdWJzY2FsZSAlPiUKICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKHN1bV9zY29yZSkpICU+JQogICAgICAgICAgICAgIGNvdW50KGN0cnksIHBhY2tldCwgc3Vic2NhbGUpKSAlPiUKICBtdXRhdGUocGFja2V0ID0gcGFzdGUoInBhY2tldCIsIHBhY2tldCksCiAgICAgICAgIGN0cnkgPSBmYWN0b3IoY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaGFuYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYWlsYW5kIiwgImNoaW5hIiwgInZhbnVhdHUiKSksCiAgICAgICAgIHN1YnNjYWxlID0gCiAgICAgICAgICAgZmFjdG9yKHN1YnNjYWxlLAogICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJleHdsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4d2xfZXh0cmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc2VfMXRvNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc2VfNXRvMTQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHNlXzV0bzE0X3RoYWkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc2VfMTV0bzE2IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzZV8xNXRvMTZfdGhhaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZXYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuX3NlbnNvcnlfc2Vla2luZyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5fYm9keV9hd2FyZW5lc3MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuX3RyYWl0X21ldGFtb29kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVyMl9oYWxsdWNpbmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52b19WSVNRX2RpYWxvZ2ljX3NwZWVjaCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZvX1ZJU1FfaW5uZXJfc3BlZWNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52b19WSVNRX2V2YWxfbW90aXZfaW5uZXJfc3BlZWNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52b19oYXJkeV9iZW50YWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVyX3Bvc2V5X2xvc2NoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb19sZXdpY2tpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YV92YW5fZWxrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGF0X2NvbmZpZGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXRfcG9zaXRpdmVfYmVsaWVmcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhdF9jb2duaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXRfdW5jb250cm9sbGFiaWxpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXRfbmVlZF9jb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlud19tZW50YWxfc3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlud19saWZlX2V2ZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbndfaW5hbmltYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlud19zZWx2ZXNfc291bHNfd29ybGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW53X2VwaXN0ZW1pYyIpLAogICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJhYnNvcnB0aW9uICh0ZWxsZWdlbikiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJzb3JwdGlvbiAoZXh0cmEpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFpbHkgc3Bpcml0dWFsIGV4cGVyaWVuY2VzICgjMS00KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlcyAoIzUtMTQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFpbHkgc3Bpcml0dWFsIGV4cGVyaWVuY2VzICgjNS0xNCB0aGFpKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlcyAoIzE1LTE2KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlcyAoIzE1LTE2IHRoYWkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Bpcml0dWFsIGV2ZW50cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zb3J5IHNlZWtpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib2R5IGF3YXJlbmVzcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbnRpb24gdG8gZmVlbGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYWxsdWNpbmF0aW9uIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZJU1E6IGRpYWxvZ2ljIHNwZWVjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZJU1E6IGlubmVyIHNwZWVjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZJU1E6IGV2YWx1YXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbm5lciBzcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFyaW5nIGV2ZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nIHN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluZCBtZXRhcGhvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogbGFjayBvZiBjb2duaXRpdmUgY29uZmlkZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjb2cuOiBwb3NpdGl2ZSBiZWxpZWZzIHJlOiB3b3JyeWluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjb2cuOiBjb2duaXRpdmUgc2VsZi1jb25zY2lvdXNuZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWNvZy46IHVuY29udHJvbGxhYmlsaXR5L2RhbmdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjb2cuOiBuZWVkIHRvIGNvbnRyb2wgdGhvdWdodHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWFsaXNtOiBtZW50YWwgc3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogbGlmZSBldmVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWFsaXNtOiBpbmFuaW1hdGUgY29uc2Npb3VzbmVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1YWxpc206IG1pbmRzLCBzZWx2ZXMsICYgd29ybGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWFsaXNtOiBlcGlzdGVtb2xvZ3kiKSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjZ9CmdncGxvdChkX2xvbmdfc3Vic2NhbGVfYm9vdCAlPiUKICAgICAgICAgZmlsdGVyKGdyZXBsKCJkdWFsaXNtIiwgc3Vic2NhbGUpKSAlPiUKICAgICAgICAgbXV0YXRlKHN1YnNjYWxlID0gCiAgICAgICAgICAgICAgICAgIGZhY3RvcihzdWJzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJEdWFsaXNtOiBNZW50YWwgc3RhdGVzXG5yYW5nZTogMCB0byA4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVhbGlzbTogTGlmZSBldmVudHNcbnJhbmdlOiAwIHRvIDUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdWFsaXNtOiBJbmFuaW1hdGUgY29uc2Npb3VzbmVzc1xucmFuZ2U6IDAgdG8gNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1YWxpc206IE1pbmRzLCBzZWx2ZXMsICYgd29ybGRcbnJhbmdlOiAwIHRvIDkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdWFsaXNtOiBFcGlzdGVtb2xvZ3lcbnJhbmdlOiAwIHRvIDUiKSkpICU+JQogICAgICAgICBtdXRhdGUocGFja2V0ID0gZ3N1YigicGFja2V0ICIsICJQIiwgcGFja2V0KSwKICAgICAgICAgICAgICAgIG1heCA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgZ3JlcGwoIm1lbnRhbCBzdGF0ZXMiLCB0b2xvd2VyKHN1YnNjYWxlKSkgfiA4LAogICAgICAgICAgICAgICAgICBncmVwbCgibGlmZSBldmVudHMiLCB0b2xvd2VyKHN1YnNjYWxlKSkgfiA1LAogICAgICAgICAgICAgICAgICBncmVwbCgiaW5hbmltYXRlIiwgdG9sb3dlcihzdWJzY2FsZSkpIH4gNiwKICAgICAgICAgICAgICAgICAgZ3JlcGwoIm1pbmRzIiwgdG9sb3dlcihzdWJzY2FsZSkpIH4gOSwKICAgICAgICAgICAgICAgICAgZ3JlcGwoImVwaXN0ZW0iLCB0b2xvd2VyKHN1YnNjYWxlKSkgfiA1KSksCiAgICAgICBhZXMoeCA9IGN0cnksIHkgPSBNZWFuLCBjb2xvciA9IGN0cnkpKSArCiAgZmFjZXRfd3JhcCh+IHJlb3JkZXIoaW50ZXJhY3Rpb24ocGFja2V0LCBzdWJzY2FsZSwgc2VwID0gIjogIiksCiAgICAgICAgICAgICAgICAgICAgICAgYXMubnVtZXJpYyhmYWN0b3IocGFja2V0KSkpLAogICAgICAgICAgICAgbmNvbCA9IDUsIHNjYWxlcyA9ICJmaXhlZCIpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gMCksIGx0eSA9IDIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBtYXgpLCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoIihuPSIsIG4sICIpIiksIHkgPSBMb3dlciksIAogICAgICAgICAgICBzaXplID0gMiwgbnVkZ2VfeCA9IDAuMTUsIGhqdXN0ID0gMCkgKwogIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kID0gYygwLCAxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDkpLCBicmVha3MgPSAwOjkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9ICJNZWFuIHN1YnNjYWxlIHNjb3JlcyBieSBzaXRlIiwKICAgICAgIHN1YnRpdGxlID0gIkEgaGlnaGVyIHNjb3JlIGluZGljYXRlcyBtb3JlICdkdWFsaXN0JyByYXRoZXIgdGhhbiAnbWF0ZXJpYWxpc3QnIHJlcG9uc2VzXG5NaW4uIGFuZCBtYXguIHNjb3JlIGZvciBlYWNoIHN1YnNjYWxlIGFyZSBkZW1hcmNhdGVkIGJ5IHRoZSBkb3R0ZWQgbGluZXNcbkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMiLAogICAgICAgeCA9ICJTaXRlIiwgY29sb3IgPSAiU2l0ZSIsCiAgICAgICB5ID0gIk1lYW4gc3Vic2NhbGUgc2NvcmUgKHJhbmdlIHZhcmllcyBieSBzdWJzY2FsZSkiKQpgYGAKClNvbWUgc3VycHJpc2luZyB0aGluZ3MgY29tZSBvdXQgb2YgdGhpczoKCi0gVVMgcGFydGljaXBhbnRzIHNjb3JlZCBoaWdoZXIgaW4gImR1YWxpc20iLCBvbiBhdmVyYWdlLCB0aGFuIG90aGVyIHBhcnRpY2lwYW50cyBpbiBuZWFybHkgZXZlcnkgc3Vic2NhbGUuIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIHdoYXQgd2UgbWlnaHQgcHJlZGljdC4KLSBHSCBhbmQgVlQgcGFydGljaXBhbnRzIC0gd2hvIHdlcmUgdGhlIG1vc3QgbGlrZWx5IHRvIGJlIGRldm91dCBDaHJpc3RpYW5zLCBnaXZlbiBvdXIgc2FtcGxlcyAtIHNjb3JlZCBxdWl0ZSBsb3cgaW4gImR1YWxpc20iIGFjcm9zcyB0aGUgYm9hcmQsIGV2ZW4gaW4gdGhlIG1vcmUgc3Bpcml0dWFsIGtpbmRzIG9mICJkdWFsaXNtIiB0aGF0IHdlcmUgY2FwdHVyZWQgYnkgdGhlICJMaWZlIGV2ZW50cyIgYW5kICJNaW5kcywgc2VsdmVzLCAmIHdvcmxkIiBzdWJzY2FsZXMuCgpMZXQncyBsb29rIGF0IHRoZXNlIGRpZmZlcmVuY2VzIGluIG1vcmUgZGV0YWlsIHVzaW5nIHRoZSAicmF3IGRhdGEiIGZvciBpbmRpdmlkdWFsIHF1ZXN0aW9ucywgcmF0aGVyIHRoYW4gdGhlc2Ugc3Vic2NhbGUgc2NvcmVzLiAoQWZ0ZXIgYWxsLCB0aGVzZSBzdWJzY2FsZXMgaGF2ZSBuZXZlciBiZWVuIHZhbGlkYXRlZCEgVGhpcyBpcyBvbmUgb2YgdGhlIHZlcnkgZmlyc3QgdGltZXMgd2UndmUgdHJpZWQgdGhpcyBzY2FsZS4pCgojIyBSZXNwb25zZXMgYnkgcXVlc3Rpb24sIGJ5IHNpdGUKClRoZXJlIGFyZSB0d28gd2F5cyB3ZSBtaWdodCB3YW50IHRvIGxvb2sgYXQgdGhlICJyYXcgZGF0YSIgaGVyZTogYWZ0ZXIgcmV2ZXJzZS1jb2RpbmcgKHdoaWNoIGFsbG93cyB1cyB0byBzZWUgaG93ICJkdWFsaXN0IiB2cy4gIm1hdGVyaWFsaXN0IiBwYXJ0aWNpcGFudHMnIHJlc3BvbnNlcyB3ZXJlIGluIGVhY2ggc2l0ZSkgYW5kIGJlZm9yZSByZXZlcnNlLWNvZGluZyAod2hpY2ggYWxsb3dzIHRvIHRvIHNlZSBob3cgb2Z0ZW4gcGVvcGxlIGNpcmNsZWQgIkkgYWdyZWUiIHZzLiAiSSBkbyBub3QgYWdyZWUiKS4gVGhlc2UgYXJlIDEwMCUgcmVkdW5kYW50LCBidXQgZm9yIHNvbWUgcHVycG9zZXMgb25lIG1pZ2h0IGJlIG1vcmUgaW50dWl0aXZlIHRoYW4gdGhlIG90aGVyLgoKIyMjIEFGVEVSIHJldmVyc2UtY29kaW5nCgpGaXJzdCwgbGV0J3MgbG9vayBhdCByZXNwb25zZXMgdGhlIHdheSB0aGV5IHdlcmUgaW50ZW5kZWQgdG8gYmUgbG9va2VkIGF0IC0gaS5lLiwgKiphZnRlcioqIHJldmVyc2UtY29kaW5nIGl0ZW1zLiBIZXJlLCB3ZSBmb2N1cyBvbiB0aGUgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2hvIGdhdmUgdGhlIG1vcmUgImR1YWxpc3QiIChpLmUuLCBsZXNzICJtYXRlcmlhbGlzdCIpIHJlc3BvbnNlIHRvIGVhY2ggcXVlc3Rpb246CgpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDAuNn0KZF9sb25nICU+JQogIGZpbHRlcihncmVwbCgibWlud18iLCBxdWVzdGlvbiksCiAgICAgICAgICMgY3RyeSAlaW4lIGMoImdoYW5hIiwgInVzIiksCiAgICAgICAgICFncmVwbCgiYXR0biIsIHF1ZXN0aW9uKSwKICAgICAgICAgIWlzLm5hKHJlc3BvbnNlKSkgJT4lCiAgbGVmdF9qb2luKHF1ZXN0aW9uX2tleSAlPiUKICAgICAgICAgICAgICBkaXN0aW5jdChxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsIAogICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgYnloYW5kX2NvZGluZywKICAgICAgICAgICAgICAgICAgICAgICBieWhhbmRfc3Vic2NhbGUpICU+JQogICAgICAgICAgICAgIHJlbmFtZShxdWVzdGlvbiA9IHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCwKICAgICAgICAgICAgICAgICAgICAgY29kaW5nID0gYnloYW5kX2NvZGluZywKICAgICAgICAgICAgICAgICAgICAgc3Vic2NhbGUgPSBieWhhbmRfc3Vic2NhbGUpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShyZXNwb25zZSA9IGZhY3RvcihyZXNwb25zZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIidNYXRlcmlhbGlzdCciLCAiJ0R1YWxpc3QnIikpLAogICAgICAgICBjb2RpbmcgPSBmYWN0b3IoY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiLTEiLCAiMSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiKFJFVkVSU0VEKSIsICIiKSksCiAgICAgICAgIHF1ZXN0aW9uX3RleHRfc2hvcnQgPSBwYXN0ZTAoc3Vic3RyKHF1ZXN0aW9uX3RleHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IDEsIHN0b3AgPSAxMDAwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiLi4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpbmcpLAogICAgICAgICBzdWJzY2FsZSA9IGZhY3RvcihzdWJzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRXBpc3RlbW9sb2d5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5hbmltYXRlIGJlaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpZmUgZXZlbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVudGFsIHN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbmRzLCBzZWx2ZXMsICYgd29ybGQiKSkpICU+JQogIGNvdW50KGN0cnksIHN1YnNjYWxlLCBxdWVzdGlvbl90ZXh0X3Nob3J0LCByZXNwb25zZSkgJT4lCiAgc3ByZWFkKHJlc3BvbnNlLCBuKSAlPiUKICBhcnJhbmdlKHN1YnNjYWxlLCBjdHJ5LCBkZXNjKGAnRHVhbGlzdCdgKSkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJvcmRlciIpICU+JQogIG11dGF0ZShvcmRlciA9IGFzLm51bWVyaWMob3JkZXIpLAogICAgICAgICB0b3RhbF9uID0gYCdNYXRlcmlhbGlzdCdgICsgYCdEdWFsaXN0J2ApICU+JQogIGdhdGhlcihyZXNwb25zZSwgbiwgYyhgJ01hdGVyaWFsaXN0J2AsIGAnRHVhbGlzdCdgKSkgJT4lCiAgbXV0YXRlKHJlc3BvbnNlID0gZmFjdG9yKHJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCInTWF0ZXJpYWxpc3QnIiwgIidEdWFsaXN0JyIpKSwKICAgICAgICAgY3RyeSA9IGZhY3RvcihjdHJ5LAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoYW5hIiwgInRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbmEiLCAidmFudWF0dSIpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHRfc2hvcnQsIGRlc2Mob3JkZXIpKSwgCiAgICAgICAgICAgICB5ID0gbiwgZmlsbCA9IHJlc3BvbnNlKSkgKwogIGZhY2V0X2dyaWQoc3Vic2NhbGUgfiBjdHJ5LCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjaygpLCBzdGF0ID0gImlkZW50aXR5IikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQobi90b3RhbF9uLCAyKSoxMDAsICIlIiksIAogICAgICAgICAgICAgICAgYWxwaGEgPSByZXNwb25zZSksIHNpemUgPSAzKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIsIHJhbmdlID0gYygwLCAxKSkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUmVzcG9uc2VzIHRvICdEdWFsaXNtJyBzY2FsZSBpdGVtcyIsCiAgICAgICBzdWJ0aXRsZSA9ICIlIGNvcnJlc3BvbmRzIHRvIHRob3NlIGdpdmluZyB0aGUgbW9yZSAnZHVhbGlzdCcgcmVzcG9uc2UsIGFmdGVyIHJldmVyc2UgY29kaW5nIiwKICAgICAgIHggPSAiIiwgeSA9ICJDb3VudCBvZiByZXNwb25zZXMiLCBmaWxsID0gIlR5cGUgb2YgcmVzcG9uc2UiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICAjIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCiAgY29vcmRfZmxpcCgpCmBgYAoKCiMjIEJFRk9SRSByZXZlcnNlLWNvZGluZwoKTm93LCBsZXQncyBsb29rIGF0IHJlc3BvbnNlcyB0aGUgd2F5IHRoZSBwYXJ0aWNpcGFudHMgc2F3IHRoZW0gLSBpLmUuLCAqKmJlZm9yZSoqIHJldmVyc2UtY29kaW5nIGl0ZW1zLiBIZXJlLCB3ZSBmb2N1cyBvbiB0aGUgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2hvIGNpcmNsZWQgIkkgYWdyZWUiIGZvciBlYWNoIHF1ZXN0aW9uOgoKYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAwLjZ9CmRfYWxsICU+JQogIHNlbGVjdChzdWJqLCBjdHJ5LCBzdGFydHNfd2l0aCgibWlud18iKSkgJT4lCiAgZ2F0aGVyKHF1ZXN0aW9uLCByZXNwb25zZSwgc3RhcnRzX3dpdGgoIm1pbndfIikpICU+JQogIGZpbHRlcihncmVwbCgibWlud18iLCBxdWVzdGlvbiksCiAgICAgICAgICMgY3RyeSAlaW4lIGMoImdoYW5hIiwgInVzIiksCiAgICAgICAgICFncmVwbCgiYXR0biIsIHF1ZXN0aW9uKSwKICAgICAgICAgIWlzLm5hKHJlc3BvbnNlKSkgJT4lCiAgbGVmdF9qb2luKHF1ZXN0aW9uX2tleSAlPiUKICAgICAgICAgICAgICBkaXN0aW5jdChxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsIAogICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgYnloYW5kX2NvZGluZywKICAgICAgICAgICAgICAgICAgICAgICBieWhhbmRfc3Vic2NhbGUpICU+JQogICAgICAgICAgICAgIHJlbmFtZShxdWVzdGlvbiA9IHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCwKICAgICAgICAgICAgICAgICAgICAgY29kaW5nID0gYnloYW5kX2NvZGluZywKICAgICAgICAgICAgICAgICAgICAgc3Vic2NhbGUgPSBieWhhbmRfc3Vic2NhbGUpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZSgjIHJlc3BvbnNlID0gZmFjdG9yKHJlc3BvbnNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbHMgPSBjKDAsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxhYmVscyA9IGMoIidNYXRlcmlhbGlzdCciLCAiJ0R1YWxpc3QnIikpLAogICAgICAgICBjb2RpbmcgPSBmYWN0b3IoY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiLTEiLCAiMSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiKFJFVkVSU0VEKSIsICIiKSksCiAgICAgICAgIHF1ZXN0aW9uX3RleHRfc2hvcnQgPSBwYXN0ZTAoc3Vic3RyKHF1ZXN0aW9uX3RleHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IDEsIHN0b3AgPSAxMDAwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiLi4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpbmcpLAogICAgICAgICBzdWJzY2FsZSA9IGZhY3RvcihzdWJzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRXBpc3RlbW9sb2d5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5hbmltYXRlIGJlaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpZmUgZXZlbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVudGFsIHN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbmRzLCBzZWx2ZXMsICYgd29ybGQiKSkpICU+JQogIGZpbHRlcighaXMubmEoc3Vic2NhbGUpKSAlPiUKICBjb3VudChjdHJ5LCBzdWJzY2FsZSwgY29kaW5nLCBxdWVzdGlvbl90ZXh0X3Nob3J0LCByZXNwb25zZSkgJT4lCiAgc3ByZWFkKHJlc3BvbnNlLCBuKSAlPiUKICBhcnJhbmdlKHN1YnNjYWxlLCBjdHJ5LCBkZXNjKGBpIGFncmVlYCkpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigib3JkZXIiKSAlPiUKICBtdXRhdGUob3JkZXIgPSBhcy5udW1lcmljKG9yZGVyKSwKICAgICAgICAgdG90YWxfbiA9IGBpIGRvIG5vdCBhZ3JlZWAgKyBgaSBhZ3JlZWApICU+JQogIGdhdGhlcihyZXNwb25zZSwgbiwgYyhgaSBkbyBub3QgYWdyZWVgLCBgaSBhZ3JlZWApKSAlPiUKICBtdXRhdGUocmVzcG9uc2UgPSBmYWN0b3IocmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImkgZG8gbm90IGFncmVlIiwgImkgYWdyZWUiKSksCiAgICAgICAgIGN0cnkgPSBmYWN0b3IoY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaGFuYSIsICJ0aGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaW5hIiwgInZhbnVhdHUiKSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSksCiAgICAgICAgIGNvZGluZyA9IGZhY3Rvcihjb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCIiLCAiKFJFVkVSU0VEKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygibm9ybWFsIiwgInJldmVyc2VkIikpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHN1YnNjYWxlKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHRfc2hvcnQsIGRlc2Mob3JkZXIpKSwgCiAgICAgICAgICAgICB5ID0gbiwgZmlsbCA9IGNvZGluZywgYWxwaGEgPSByZXNwb25zZSkpICsKICBmYWNldF9ncmlkKHN1YnNjYWxlIH4gY3RyeSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2soKSwgc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKG4vdG90YWxfbiwgMikqMTAwLCAiJSIpLCAKICAgICAgICAgICAgICAgIGFscGhhID0gcmVzcG9uc2UpLCBzaXplID0gMykgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiLCByYW5nZSA9IGMoMCwgMSkpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJSZXNwb25zZXMgdG8gJ0R1YWxpc20nIHNjYWxlIGl0ZW1zIiwKICAgICAgIHN1YnRpdGxlID0gIiUgY29ycmVzcG9uZHMgdG8gdGhvc2Ugd2hvIHNheSAnSSBhZ3JlZSwnIEJFRk9SRSByZXZlcnNlLWNvZGluZyIsCiAgICAgICB4ID0gIiIsIHkgPSAiQ291bnQgb2YgcmVzcG9uc2VzIiwgZmlsbCA9ICJUeXBlIG9mIHF1ZXN0aW9uIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgIyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQogIGNvb3JkX2ZsaXAoKQpgYGAKCkVpdGhlciB3YXkgd2UgbG9vayBhdCBpdCwgYSBmZXcgd2VpcmQgdGhpbmdzIGp1bXAgb3V0LiBKdXN0IHRvIGhpZ2hsaWdodCBhIGZldyB0aGF0IEpvaG4gYW5kIEkgbm90aWNlZDoKCi0gT25seSA3NSUgb2YgR0ggcGFydGljaXBhbnRzIGNpcmNsZWQgIkkgYWdyZWUiIHRvIHRoZSBpdGVtICJJIGJlbGlldmUgaW4gc29tZXRoaW5nIGxpa2UgYSBzb3VsIG9yIGEgc3Bpcml0IiAoaW4gdGhlICJNaW5kcywgc2VsdmVzLCAmIHdvcmxkIiBzdWJzY2FsZSkuIFRoaXMgaXMgbG93ZXIgdGhhbiB0aGUgVVMhCi0gNTYlIG9mIEdIIHBhcnRpY2lwYW50cyBjaXJjbGVkICJJIGFncmVlIiB0byB0aGUgaXRlbSAiRXZlbiB0aG91Z2ggc29tZSBwZW9wbGUgYmVsaWV2ZSBpbiBzb3VscyBvciBzcGlyaXRzLCB0aGVyZSBpcyByZWFsbHkgbm8gc3VjaCB0aGluZyIgKGFsc28gaW4gdGhlICJNaW5kcywgc2VsdmVzLCAmIHdvcmxkIiBzdWJzY2FsZSkuIFRoaXMgc2VlbXMgcmVhbGx5IG9mZiwgYW5kIGl0J3MgdmVyeSBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgIkkgYmVsaWV2ZSBpbiBzb21ldGhpbmcgbGlrZSBhIHNvdWwgb3IgYSBzcGlyaXQiIGl0ZW0sIGFib3ZlLgotIDU1JSBvZiBHSCBwYXJ0aWNpcGFudHMgYW5kIDQzJSBvZiBWVCBwYXJ0aWNpcGFudHMgY2lybGNlZCAiSSBhZ3JlZSIgdG8gdGhlIGl0ZW0gIlRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYW4gYWZ0ZXJsaWZlIiAoaW4gdGhlICJMaXZlIGV2ZW50cyIgc3Vic2NhbGUpLiBUaGlzIGlzIGxvd2VyIHRoYW4gSSdkIHByZWRpY3QgYW1vbmcgZGV2b3V0IENocmlzdGlhbnMuCgpNYW55IG9mIHRoZXNlIHF1ZXN0aW9ucyBzZWVtIHRvIGhhdmUgYmVlbiBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMgaW4gR2hhbmEsIHRob3VnaCBpdCBjb3VsZCBiZSB1c2VmdWwgdG8gZ2V0IG90aGVyIHBlcnNwZWN0aXZlcyBvbiB0aGUgcmVzcG9uc2VzIGZyb20gZWFjaCBzaXRlLgoKIyBTY2FsZSBzdHJ1Y3R1cmUKCkFub3RoZXIga2luZCBvZiBxdWVzdGlvbiB5b3UgY291bGQgYXNrIGlzIGhvdyB0aGUgZGlmZmVyZW50IHF1ZXN0aW9ucyB3ZXJlIGNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyLCBib3RoIG92ZXJhbGwgYW5kIHdpdGhpbiBlYWNoIHNpdGUuCgojIyBPdmVyYWxsCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9Cm92ZXJhbGwgPC0gZF9sb25nICU+JQogIGZpbHRlcihncmVwbCgibWlud18iLCBxdWVzdGlvbiksICFncmVwbCgiYXR0biIsIHF1ZXN0aW9uKSwgCiAgICAgICAgICFpcy5uYShyZXNwb25zZSkpICU+JQogIHNlbGVjdChzdWJqLCBxdWVzdGlvbiwgcmVzcG9uc2UpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsIAogICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl90ZXh0LCBieWhhbmRfc3Vic2NhbGUpICU+JSAKICAgICAgICAgICAgICByZW5hbWUocXVlc3Rpb24gPSBxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwpKSAlPiUKICBkaXN0aW5jdChzdWJqLCBxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgc3ByZWFkKHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqIikKCm92ZXJhbGxfY2x1c3QgPC0gaGNsdXN0KGRpc3QodChvdmVyYWxsKSkpCmdnZGVuZHJvZ3JhbShvdmVyYWxsX2NsdXN0LCByb3RhdGUgPSBUUlVFKQpgYGAKCiMjIEJ5IHNpdGUKCiMjIyBVUyBhbG9uZQoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQp1cyA8LSBkX2xvbmcgJT4lCiAgZmlsdGVyKGdyZXBsKCJtaW53XyIsIHF1ZXN0aW9uKSwgIWdyZXBsKCJhdHRuIiwgcXVlc3Rpb24pLCAKICAgICAgICAgIWlzLm5hKHJlc3BvbnNlKSwgY3RyeSA9PSAidXMiKSAlPiUKICBzZWxlY3Qoc3ViaiwgcXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICBsZWZ0X2pvaW4ocXVlc3Rpb25fa2V5ICU+JSAKICAgICAgICAgICAgICBzZWxlY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25fdGV4dCwgYnloYW5kX3N1YnNjYWxlKSAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lKHF1ZXN0aW9uID0gcXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsKSkgJT4lCiAgZGlzdGluY3Qoc3ViaiwgcXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJlbW92ZV9yb3duYW1lcygpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaiIpCgp1c19jbHVzdCA8LSBoY2x1c3QoZGlzdCh0KHVzKSkpCmdnZGVuZHJvZ3JhbSh1c19jbHVzdCwgcm90YXRlID0gVFJVRSkKYGBgCgojIyMgR2hhbmEgYWxvbmUKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KZ2hhbmEgPC0gZF9sb25nICU+JQogIGZpbHRlcihncmVwbCgibWlud18iLCBxdWVzdGlvbiksICFncmVwbCgiYXR0biIsIHF1ZXN0aW9uKSwgCiAgICAgICAgICFpcy5uYShyZXNwb25zZSksIGN0cnkgPT0gImdoYW5hIikgJT4lCiAgc2VsZWN0KHN1YmosIHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgbGVmdF9qb2luKHF1ZXN0aW9uX2tleSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCwgCiAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uX3RleHQsIGJ5aGFuZF9zdWJzY2FsZSkgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShxdWVzdGlvbiA9IHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCkpICU+JQogIGRpc3RpbmN0KHN1YmosIHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBzcHJlYWQocXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmoiKQoKZ2hhbmFfY2x1c3QgPC0gaGNsdXN0KGRpc3QodChnaGFuYSkpKQpnZ2RlbmRyb2dyYW0oZ2hhbmFfY2x1c3QsIHJvdGF0ZSA9IFRSVUUpCmBgYAoKCgoKIyMjIFRoYWlsYW5kIGFsb25lCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9CnRoYWlsYW5kIDwtIGRfbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLCAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksIAogICAgICAgICAhaXMubmEocmVzcG9uc2UpLCBjdHJ5ID09ICJ0aGFpbGFuZCIpICU+JQogIHNlbGVjdChzdWJqLCBxdWVzdGlvbiwgcmVzcG9uc2UpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsIAogICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl90ZXh0LCBieWhhbmRfc3Vic2NhbGUpICU+JSAKICAgICAgICAgICAgICByZW5hbWUocXVlc3Rpb24gPSBxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwpKSAlPiUKICBkaXN0aW5jdChzdWJqLCBxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgc3ByZWFkKHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqIikKCnRoYWlsYW5kX2NsdXN0IDwtIGhjbHVzdChkaXN0KHQodGhhaWxhbmQpKSkKZ2dkZW5kcm9ncmFtKHRoYWlsYW5kX2NsdXN0LCByb3RhdGUgPSBUUlVFKQpgYGAKCiMjIyBWYW51YXR1IGFsb25lCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9CnZhbnVhdHUgPC0gZF9sb25nICU+JQogIGZpbHRlcihncmVwbCgibWlud18iLCBxdWVzdGlvbiksICFncmVwbCgiYXR0biIsIHF1ZXN0aW9uKSwgCiAgICAgICAgICFpcy5uYShyZXNwb25zZSksIGN0cnkgPT0gInZhbnVhdHUiKSAlPiUKICBzZWxlY3Qoc3ViaiwgcXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICBsZWZ0X2pvaW4ocXVlc3Rpb25fa2V5ICU+JSAKICAgICAgICAgICAgICBzZWxlY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25fdGV4dCwgYnloYW5kX3N1YnNjYWxlKSAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lKHF1ZXN0aW9uID0gcXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsKSkgJT4lCiAgZGlzdGluY3Qoc3ViaiwgcXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJlbW92ZV9yb3duYW1lcygpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaiIpCgp2YW51YXR1X2NsdXN0IDwtIGhjbHVzdChkaXN0KHQodmFudWF0dSkpKQpnZ2RlbmRyb2dyYW0odmFudWF0dV9jbHVzdCwgcm90YXRlID0gVFJVRSkKYGBgCgoKCg==